BOJ_7569_토마토
3차원 배열을 탐색하는 너비 우선 탐색(BFS)문제
풀긴 했지만 3차원 배열에 맞게 탐색을 dx, dy, dz로 주는 것이 좋았을 것이다
dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, -1, 1, 0, 0]
dz = [0, 0, 0, 0, -1, 1]
처음 입력을 받을 때 -1이 아닌 토마토의 개수를 모두 세었고, bfs 탐색 중에 개수가 0이 되면 return을 했다
이미 익은 토마토를 입력 받고, 전체를 queue에 넣어서 bfs를 돌렸다
`
from collections import deque
import copy
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
M, N, H = list(map(int, input().split()))
red_tomato = []
count = 0
tomato = []
for k in range(H):
box = []
for i in range(N):
arr = list(map(int, input().split()))
line = []
for j in range(M):
line.append(arr[j])
if arr[j] == 1:
red_tomato.append((k, i, j))
elif arr[j] == 0:
count += 1
box.append(line)
tomato.append(box)
def bfs(tomato_box, red_tomato_position, tomato_cnt):
day = 0
queue = deque()
queue.extend(red_tomato_position)
term = len(queue)
while queue:
if term == 0:
term = len(queue)
day += 1
t = queue.popleft()
# 사방
for i in range(4):
nx = t[1] + dx[i]
ny = t[2] + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= M or tomato_box[t[0]][nx][ny] != 0:
continue
tomato_box[t[0]][nx][ny] = 1
tomato_cnt -= 1
if tomato_cnt == 0:
return day + 1
queue.append((t[0], nx, ny))
for i in range(-1, 2, 2):
nh = t[0] + i
if nh < 0 or nh >= H or tomato_box[nh][t[1]][t[2]] != 0:
continue
tomato_box[nh][t[1]][t[2]] = 1
tomato_cnt -= 1
if tomato_cnt == 0:
return day + 1
queue.append((nh, t[1], t[2]))
term -= 1
return -1
if count == 0:
print(0)
else:
day = bfs(tomato, red_tomato, count)
print(day)